# 使用 Node.js 22 Alpine 作为基础镜像
FROM node:22-alpine AS builder

# 设置工作目录
WORKDIR /app

# 安装基础工具
RUN apk add --no-cache \
    git \
    curl \
    wget \
    bash \
    vim \
    && rm -rf /var/cache/apk/*

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001

# 修复权限问题
USER root
RUN chown -R nextjs:nodejs /app

# 配置国内镜像源（关键优化！）
RUN npm config set registry https://registry.npmmirror.com/ && \
    npm config set cache /tmp/.npm && \
    npm config set prefer-offline true

# 设置二进制文件镜像环境变量
ENV ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ \
    SASS_BINARY_SITE=https://npmmirror.com/mirrors/node-sass/ \
    PHANTOMJS_CDNURL=https://npmmirror.com/mirrors/phantomjs/ \
    CHROMEDRIVER_CDNURL=https://npmmirror.com/mirrors/chromedriver

# 设置环境变量
ENV NODE_ENV=production
ENV PATH=/app/node_modules/.bin:$PATH

# 切换到非 root 用户
USER nextjs

# 暴露端口
EXPOSE 3000

# 默认命令
CMD ["node", "--version"]

# ============================================
# Docker 镜像操作命令注释
# ============================================

# 1. 构建镜像
# docker build -t dockerfilenode22:alpine .

# 2. 运行容器测试
# docker run --rm dockerfilenode22:alpine

# 导出镜像为 tar 文件
# docker save -o dockerfilenode22-alpine.tar dockerfilenode22:alpine

# 传输 tar 文件到目标服务器
# scp dockerfilenode22-alpine.tar water@10.48.0.86:/home/water/docker/wenyu/

# 在目标服务器上导入镜像
# docker load -i dockerfilenode22-alpine.tar

# 查看导入的镜像
# docker images | grep dockerfilenode22

# 打 latest 标签
# docker tag dockerfilenode22:alpine 172.20.7.86:5001/nodejs/node22-alpine:latest

# 登录 Nexus 仓库
# docker login 172.20.7.86:5001
# admin
# admin123

# 推送镜像到仓库
# docker push 172.20.7.86:5001/nodejs/node22-alpine:latest

# 检查镜像仓库中的标签列表
# curl -u admin:admin123 -X GET "http://172.20.7.86:5001/v2/nodejs/node22-alpine/tags/list"

# 获取 latest 标签的镜像清单
# curl -u admin:admin123 -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET "http://172.20.7.86:5001/v2/nodejs/node22-alpine/manifests/latest"

# 检查仓库目录
# curl -u admin:admin123 -X GET "http://172.20.7.86:5001/v2/_catalog"

# 获取镜像的详细配置信息
# curl -u admin:admin123 -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET "http://172.20.7.86:5001/v2/nodejs/node22-alpine/manifests/latest" | jq .

# 如果您推送了多个标签，可以检查特定标签
# curl -u admin:admin123 -X GET "http://172.20.7.86:5001/v2/nodejs/node22-alpine/manifests/v1.0.0"

# 快速检查镜像是否存在（只返回状态码）
# curl -u admin:admin123 -I "http://172.20.7.86:5001/v2/nodejs/node22-alpine/manifests/latest"

# 从其他机器拉取镜像
# docker pull 172.20.7.86:5001/nodejs/node22-alpine:latest

# 验证拉取的镜像
# docker run --rm 172.20.7.86:5001/nodejs/node22-alpine:latest